#[钛妹]: 钛哥！今天学Python的类，类就像做饼干的模具吗？
#[钛哥]: 精辟！不过咱们的模具还能自己长腿跑呢。看这个快递柜：

class SmartLocker:
    """模拟智能快递柜的类"""
    total_lockers = 0  # 类属性：全局计数器
    
    #[钛妹]: 这个__init__是初始化方法？
    #[钛哥]: 没错！就像新快递柜出厂设置：
    def __init__(self, location, size="M"):
        self.location = location    # 实例属性：摆放位置
        self.size = size            # 'S'小/'M'中/'L'大
        self.packages = []          # 包裹存储列表
        SmartLocker.total_lockers += 1  # 每新建一个就+1
        
    #[钛妹]: 这个self好奇怪，必须写吗？
    #[钛哥]: 这是实例的身份证！看这个取件方法：
    def pick_up(self, tracking_num):
        """模拟取件操作"""
        for pkg in self.packages:
            if pkg["tracking"] == tracking_num:
                self.packages.remove(pkg)
                return "取件成功"
        return "包裹不存在"
    
    #[钛妹]: 快递柜显示状态怎么写？
    #[钛哥]: 用__str__魔法方法：
    def __str__(self):
        return (f"【{self.location}快递柜】"
                f"尺寸：{self.size} 包裹数：{len(self.packages)}")
    
    #[钛妹]: 类方法有什么用呀？
    #[钛哥]: 管理所有柜子，比如统计总数：
    @classmethod
    def show_total(cls):
        print(f"当前运营中快递柜：{cls.total_lockers}台")
    
    #[钛妹]: 静态方法呢？好像没用self？
    #[钛哥]: 放些通用工具，比如生成验证码：
    @staticmethod
    def generate_code(length=6):
        import random
        return ''.join(str(random.randint(0,9)) for _ in range(length))

#[钛妹]: 实例化试试看！
#[钛哥]: 先给办公楼部署两个：
locker1 = SmartLocker("A座大堂", "L")
locker2 = SmartLocker("B2停车场", "S")

#[钛妹]: 存包裹怎么操作？
#[钛哥]: 直接操作实例属性：
locker1.packages.append({
    "tracking": "SF123456",
    "recipient": "钛妹",
    "weight": 2.5
})

#[钛妹]: 看看柜子状态！
print(locker1)  # 【A座大堂快递柜】尺寸：L 包裹数：1
print(locker2)  # 【B2停车场快递柜】尺寸：S 包裹数：0

#[钛妹]: 我要取件试试！
result = locker1.pick_up("SF123456")
print(result)  # 取件成功

#[钛妹]: 类方法调用姿势？
SmartLocker.show_total()  # 当前运营中快递柜：2台

#[钛妹]: 静态方法生成验证码：
code = SmartLocker.generate_code()
print(f"您的验证码：{code}")  # 类似：您的验证码：529371

#[钛妹]: 继承是怎么回事？
#[钛妹]: 比如冷藏快递柜？

class FridgeLocker(SmartLocker):
    """带冷藏功能的快递柜"""
    def __init__(self, location, temp=4):
        super().__init__(location, "L")  # 必须用大尺寸
        self.temperature = temp   # 摄氏度
        
    #[钛哥]: 重写父类方法：
    def pick_up(self, tracking_num):
        result = super().pick_up(tracking_num)
        return result + "，请注意冷藏物品及时取走"
    
    #[钛妹]: 添加专属方法
    def set_temperature(self, temp):
        if 0 <= temp <= 10:
            self.temperature = temp
            return "温度设置成功"
        return "温度超出合理范围"

#[钛妹]: 试试这个子类
cold_locker = FridgeLocker("C座咖啡厅", 6)
cold_locker.packages.append({
    "tracking": "JD778899",
    "recipient": "钛哥",
    "content": "生鲜食品"
})

#[钛妹]: 看看继承效果
print(cold_locker)  # 【C座咖啡厅快递柜】尺寸：L 包裹数：1
print(cold_locker.pick_up("JD778899"))  # 取件成功，请注意...

#[钛妹]: 温度控制测试
print(cold_locker.set_temperature(25))  # 温度超出合理范围

#[钛妹]: 多态怎么体现？
def check_locker_status(locker):
    """演示多态的函数"""
    print(f"状态检查：{locker}")
    print(f"当前温度：{getattr(locker, 'temperature', 'N/A')}℃")

check_locker_status(locker1)     # 普通柜显示N/A
check_locker_status(cold_locker) # 显示实际温度

#[钛妹]: 私有属性怎么用？
#[钛哥]: 双下划线开头，比如：
class Test:
    def __init__(self):
        self.__secret = "这是类内部机密"
        
    def get_secret(self):
        return self.__secret[-3:]  # 只返回后三位

t = Test()
#print(t.__secret)  # 报错！
print(t.get_secret())  # 显示如'机密'

#[钛妹]: 属性装饰器有什么用？
#[钛哥]: 安全控制，比如：
class TemperatureControlled:
    def __init__(self):
        self._temp = 20
        
    @property
    def temp(self):
        return self._temp
    
    @temp.setter
    def temp(self, value):
        if 10 <= value <= 30:
            self._temp = value
        else:
            print("温度超出安全范围")

tc = TemperatureControlled()
tc.temp = 100  # 温度超出安全范围
print(tc.temp)  # 仍显示20

#[钛妹]: 今天学到了好多！总结一下：
#[钛妹]: 类像智能模具，能造出带技能的实例
#[钛妹]: __init__是出生证明，__str__是身份证
#[钛妹]: 继承就像基因改造，扩展新功能
#[钛妹]: 对了各位！持续学习才是硬道理！点赞关注不迷路！